package net.suplementos.negocio;

import java.util.List;

import javax.naming.InitialContext;
import javax.naming.NamingException;

import net.suplementos.exception.CampoObrigatorioException;
import net.suplementos.exception.ErroInternoException;
import net.suplementos.exception.RegistroInexistenteException;
import net.suplementos.exception.RegistroJaExistenteException;
import net.suplementos.pojo.BaixaProduto;
import net.suplementos.pojo.Cliente;
import net.suplementos.pojo.Estoque;
import net.suplementos.pojo.FormaPagamento;
import net.suplementos.pojo.Fornecedor;
import net.suplementos.pojo.Lote;
import net.suplementos.pojo.Marca;
import net.suplementos.pojo.Produto;
import net.suplementos.servico.ControleServico;


public class ControleDelegate implements ControleServico {

    private static ControleDelegate delegate;
    private InitialContext context;
    
    private ControleDelegate() {
        try {
            context = new InitialContext();
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }
    
    public static ControleServico getInstance() {
        if (delegate == null) {
            delegate = new ControleDelegate();
        }
        
        return delegate;
    }
    
    private ControleServico getRemote() {
        try {
            return (ControleServico) context.lookup("/net/suplementos/facade/Controle/remote");
        } catch (NamingException e) {
            throw new ErroInternoException(e.getMessage(), e);
        }
    }

	/*
	 * Fornecedor
	 */
	public List<Fornecedor> consultar(Fornecedor fornecedor) throws CampoObrigatorioException {
	    return getRemote().consultar(fornecedor);
	}

	public List<FormaPagamento> listarFormasPagamentoFornecedor(Fornecedor fornecedor) throws RegistroInexistenteException {
	    return getRemote().listarFormasPagamentoFornecedor(fornecedor);
	}

	public Fornecedor getFornecedor(Integer id) {
	    return getRemote().getFornecedor(id);
	}

	public void alterar(Fornecedor fornecedor) throws CampoObrigatorioException, RegistroInexistenteException {
	    getRemote().alterar(fornecedor);
	}

	public void salvar(Fornecedor fornecedor) throws CampoObrigatorioException, RegistroJaExistenteException {
	    getRemote().salvar(fornecedor);
	}

	public void associarFornecedorMarca(Fornecedor fornecedor, Marca marca) throws CampoObrigatorioException, 
			RegistroJaExistenteException {
	    getRemote().associarFornecedorMarca(fornecedor, marca);
	}
	
	public void associarFornecedorProduto(Fornecedor fornecedor, Produto produto) throws CampoObrigatorioException, 
			RegistroJaExistenteException {
	    getRemote().associarFornecedorProduto(fornecedor, produto);
	}

	public void desassociarFornecedorMarca(Fornecedor fornecedor, Marca marca) throws CampoObrigatorioException, 
			RegistroJaExistenteException {
	    getRemote().desassociarFornecedorMarca(fornecedor, marca);
	}
	
	public void desassociarFornecedorProduto(Fornecedor fornecedor, Produto produto) throws CampoObrigatorioException, 
			RegistroJaExistenteException {
	    getRemote().desassociarFornecedorProduto(fornecedor, produto);
	}

	/*
	 * Cliente
	 */
	public List<Cliente> consultar(Cliente cliente) throws CampoObrigatorioException {
	    return getRemote().consultar(cliente);
	}

	public Cliente getCliente(Integer id) {
	    return getRemote().getCliente(id);
	}

	public void alterar(Cliente cliente) throws CampoObrigatorioException, RegistroInexistenteException {
	    getRemote().alterar(cliente);
	}

	public void salvar(Cliente cliente) throws CampoObrigatorioException {
	    getRemote().salvar(cliente);
	}
	
	public void salvar(Lote lote) throws CampoObrigatorioException {
	    getRemote().salvar(lote);
	}

	public void alterar(Lote lote) throws CampoObrigatorioException {
	    getRemote().alterar(lote);
	}
	
	public List<Produto> consultarProdutosAtivos(Produto produto) throws CampoObrigatorioException {
	    return getRemote().consultarProdutosAtivos(produto);
	}
	
	public void efetuarBaixaProduto(BaixaProduto baixaProduto) throws CampoObrigatorioException {
	    getRemote().efetuarBaixaProduto(baixaProduto);
	}
	
	public Estoque getOuCriaEstoque(Produto produto) {
	    return getRemote().getOuCriaEstoque(produto);
	}
	
	public Lote getLote(Integer id) {
	    return getRemote().getLote(id);
	}

	@Override
	public List<Lote> listarLotesEstoque(Estoque estoque) {
		return getRemote().listarLotesEstoque(estoque);
	}
}
